package Servidor;

//Servidor que recibe y envía paquetes de/a un cliente.
import java.io.*;
import java.net.*;
import java.awt.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;

import Hilo.hilo;
import Socket.SocketBytes;

public class Servidor extends JFrame {

	private static final long serialVersionUID = 1L;
	private JTextArea areaPantalla;
	private ServerSocket socket;
	private int puerto;
	private int maxcon; 
	private int numcon; 
	
	private JPanel panelJugador1;
	private JPanel panelJugador2;
	public JButton btnIniciarJuego;
	
	private boolean pintar = true;
	
	private JLabel lblPuertoEs;
	private JLabel lblModo;
	private JLabel lblMaxJug;
	private JLabel lblEtsiiBuzz;
	private JSeparator separatorSer;
	private JLabel lblPartidaIni;
	private JLabel lblJugadores;
	private JScrollPane scrollPane;
	
	public boolean contesto;
	public boolean conectados;
	public int contestacionespregunta0;
	public int contestacionespregunta1;
	public boolean acertadapregunta0;
	public boolean acertadapregunta1;
	public int esperopreg1;
	public int esperopreg0;

	
	public int acerto[];
	
	public class jugador
	{
		public int ID;
		public String Name;
		
		jugador(){
			ID = -1;
			Name = "";
		}

	}
	
	public jugador jugadores[];
	

 // configurar GUI y DatagramSocket
	public Servidor(int puerto_in, int maxcon_in) throws IOException {
		super("Modo servidor -> Numero de jugadores: " + maxcon_in + " Puerto de escucha: " + puerto_in);
		contesto=false;
		conectados = false;
		acertadapregunta0 = false;
		acertadapregunta1 = false;
		
		acerto = new int[2];
		acerto[0]=-99999;
		acerto[1]=-99999;
		contestacionespregunta0=-1;
		contestacionespregunta1=0;
		
		jugadores = new jugador [5];
		jugadores[0] = new jugador();
		jugadores[1] = new jugador();
		jugadores[2] = new jugador();
		
		
		puerto = puerto_in;
		maxcon = maxcon_in;
		numcon = 0;
		
	    areaPantalla = new JTextArea();
	        
	    setVisible(true);
    
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    setBounds(100, 100, 633, 455);
		
		JPanel contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
	    JPanel panelPrincipal = new JPanel();
	    panelPrincipal.setBounds(0, 0, 633, 343);
	    contentPane.add(panelPrincipal);
	    panelPrincipal.setLayout(null);
	    
	    lblModo = new JLabel("Modo servidor");
		lblModo.setBounds(32, 25, 233, 44);
		lblModo.setFont(new Font("Marker Felt", Font.PLAIN, 19));
		panelPrincipal.add(lblModo);
		
		separatorSer = new JSeparator();
		separatorSer.setBounds(19, 59, 597, 12);
		panelPrincipal.add(separatorSer);
	    
		areaPantalla.setFont(new Font("Marker Felt", Font.PLAIN, 15));
	
		scrollPane = new JScrollPane(areaPantalla);
		scrollPane.setViewportBorder(UIManager.getBorder("FormattedTextField.border"));
		scrollPane.setBounds(32, 92, 569, 223);
		panelPrincipal.add(scrollPane);
		scrollPane.setBackground(new Color(238,238,238));

		
		lblEtsiiBuzz = new JLabel("Etsii BUZZ");
		lblEtsiiBuzz.setBounds(520, 25, 81, 16);
		lblEtsiiBuzz.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		panelPrincipal.add(lblEtsiiBuzz); 
	    
	    JPanel panelBarra = new JPanel();
	    panelBarra.setBounds(0, 344, 633, 89);
	    contentPane.add(panelBarra);
	    panelBarra.setBorder(new MatteBorder(3, 2, 2, 2, (Color) new Color(0, 0, 0)));
	    panelBarra.setBackground(Color.GRAY);
	    panelBarra.setLayout(null);
	
	    lblPartidaIni = new JLabel("Partida 1: Esperando");
	    lblPartidaIni.setFont(new Font("Marker Felt", Font.PLAIN, 17));
	    lblPartidaIni.setBounds(48, 31, 157, 34);
		panelBarra.add(lblPartidaIni);
	    
		lblJugadores = new JLabel("Jugadores");
	    lblJugadores.setFont(new Font("Marker Felt", Font.PLAIN, 13));
	    lblJugadores.setBounds(532, 21, 61, 16);
	    panelBarra.add(lblJugadores);
	    
	    panelJugador1 = new JPanel();
	    panelJugador1.setBorder(new LineBorder(new Color(0, 0, 0)));
	    panelJugador1.setBackground(Color.green);
	    panelJugador1.setBounds(542, 45, 10, 10);
	    panelBarra.add(panelJugador1);
	   	
	    panelJugador2 = new JPanel();
	    panelJugador2.setBackground(Color.green);
		panelJugador2.setBorder(new LineBorder(new Color(0, 0, 0)));
		panelJugador2.setBounds(563, 45, 10, 10);
		panelBarra.add(panelJugador2);
		
		lblMaxJug = new JLabel("M\u00E1ximos jugadores: " + maxcon);
		lblMaxJug.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblMaxJug.setBounds(253, 21, 115, 16);
		panelBarra.add(lblMaxJug);
	
		lblPuertoEs = new JLabel("Puerto de escucha: " + puerto);
		lblPuertoEs.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblPuertoEs.setBounds(253, 56, 140, 16);
		panelBarra.add(lblPuertoEs);	
			   

		// crear objeto DatagramSocket para enviar y recibir paquetes
		try {
			socket = new ServerSocket(puerto);
		}

		// procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
		catch( SocketException excepcionSocket ) {
			excepcionSocket.printStackTrace();
			System.exit( 1 );
		}
	} // fin del constructor de Servidor

 
	public synchronized void subnumcon() {
	 	escribirMensaje("Jugador ha abandonado a la partida.\n");
	 	numcon--;
 	} // subnumcon

 	private synchronized void addnumcon() throws Exception {	 
 		numcon++;
 	} // addnumcon
 	
 	// esperar a que lleguen los paquetes, mostrar los datos y repetir el paquete al cliente
 	public void esperarPaquetes() throws Exception {
 		while (true) {
 			// Comprobar si existen conexiones libres
 			while (numcon == maxcon) {
 				synchronized(this) {
 					try {
 					} catch (Exception e) // Imprimir cualquier excepcion
 					{ /* System.err.println(e); */ }
 				}
 			} // while ...

 			siempreVisibible();
 			
 			SocketBytes SocketDatos = new SocketBytes(socket.accept());
         
 			addnumcon();        
         
 			// Arrancar hilo que atiende esta conexion por el Socket SocketDatos y recibe este objeto para actualizar
 			// el n�mero de conexiones libres.
 			hilo h = new hilo(SocketDatos, this,maxcon,numcon);
 			h.start(); 
         
 			if(numcon==maxcon){
 				
 				escribirMensaje("\nLa partida comenzara en un ratito.\n Esten Atentos!!!.");
 	    		 Thread.sleep(5000);
 	    		 conectados = true;
 	    		 contestacionespregunta0=0;
 	    		TodosConectados();

 			}
 		} // while ...
 	} // fin del método esperarPaquetes
 
 	public void escribirMensaje(String msg){
 		areaPantalla.setText(areaPantalla.getText() + msg);	 
 	}
 	
 	public void escribirMensajeNuevo(String msg){
 		areaPantalla.setText( msg);	 
 	}
 	
 	public void luzVerde(int id){
 		if (id == 1)
 			panelJugador1.setBackground(Color.GREEN);
 		else
 			panelJugador2.setBackground(Color.GREEN);
 		
 		pintar = false; 
 	}
 	
 	public void siempreVisibible() {
 		if (pintar) {
 			lblPartidaIni.setBackground(Color.red);
		    panelJugador1.setBackground(Color.red);
			panelJugador2.setBackground(Color.red);
			lblPuertoEs.setBackground(Color.red);
			lblModo.setBackground(Color.red);
			lblMaxJug.setBackground(Color.red);
			lblEtsiiBuzz.setBackground(Color.red);
			separatorSer.setBackground(new Color(238,238,238));
			lblJugadores.setBackground(Color.red);
			scrollPane.setBackground(Color.white);
 		}
 	}
 	
 	public void TodosConectados() {
 		lblPartidaIni.setText("Partida 1: Iniciada");
 	}
} // fin de la clase Servidor